<?php

/**
 * Ticket form.
 *
 * @package    help
 * @subpackage form
 * @author     Evgeny Babin <psylosss@gmail.com>
 * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class TicketForm extends BaseTicketForm
{
  private function formatUser(sfGuardUserProfile $user)
  {
    return $user->User->username.' ('.$user->fullname.')';
  }
  
  public function configure()
  {
    if ($this->isNew())
    {
      unset($this['created_at'],$this['updated_at']);
    }
    else
    {
      $this->widgetSchema['created_at']=new sfWidgetFormReadonly(array(
        'value'=>$this->getObject()->getDateTimeObject('created_at')->format('d.m.Y, H:i:s'),
      ));
      
      $this->widgetSchema['updated_at']=new sfWidgetFormReadonly(array(
        'value'=>$this->getObject()->getDateTimeObject('updated_at')->format('d.m.Y, H:i:s'),
      ));
    }
    
    $this->widgetSchema->moveField('title', sfWidgetFormSchema::FIRST);
    
    $this->widgetSchema['title']->setAttribute('size',60);
    
    //Для нового тикета добавляем поле для ввода первого сообщения
    if ($this->isNew())
    {
      //$message_form=new MessageForm(array(),array('ticket'=>$this),false);
      /*
        Здесь можно было бы embed MessageForm, но из-за одного поля не хочется менять шаблон, чтобы
        это поле не выглядело как embedded. Просто сделаю такой же виджет и валидатор
      */
      
      $this->widgetSchema['message_text']=new sfWidgetFormTextarea(array(
        'label'=>'Сообщение'
      ),array(
        'cols'=>60,
        'rows'=>6,
      ));
      
      $this->widgetSchema->moveField('message_text', sfWidgetFormSchema::AFTER, 'title');
      
      $this->validatorSchema['message_text']=new sfValidatorString(array(
        'required'=>true,
      ));
    }
    
    
    //Тикет может быть видимым только тому, с кем текущему пользователю разрешено общаться в рамках данного проекта. То же самое с ответственным
    $users_choices=array();
    $project_id=sfContext::getInstance()->getUser()->getGuardUser()->Profile->CurrentProject->id;
    $users_available=UserQuery::create()->whereIn('id',sfContext::getInstance()->getUser()->getGuardUser()->Profile->AllowInteractUsers->getPrimaryKeys())->filterByProjectId($project_id)->execute();
    
    foreach ($users_available as $user)
    {
      if (sfContext::getInstance()->getUser()->getGuardUser()->Profile->id!=$user->id)
        $users_choices[$user->id]=$this->formatUser($user->Profile);
    }
    
    $this->widgetSchema['visible_to_users_list']=new sfWidgetFormChoice(array(
      'multiple'=>true,
      'choices'=>$users_choices,
      'expanded'=>true,
    ));
    $this->validatorSchema['visible_to_users_list']=new sfValidatorChoice(array(
      'multiple'=>true,
      'choices'=>array_keys($users_choices),
      'required'=>false,
    ));
    
    $users_choices[sfContext::getInstance()->getUser()->getGuardUser()->id]='[Я]';
    
    
    
    //Селектор ответственного пользователя
    $this->widgetSchema['current_user_id']=new sfWidgetFormChoice(array(
      'multiple'=>false,
      'choices'=>$users_choices,
      'expanded'=>false,
    ));
    $this->validatorSchema['current_user_id']=new sfValidatorChoice(array(
      'multiple'=>false,
      'choices'=>array_keys($users_choices),
    ));
    
    
    //Нельзя сделать ответственным того, кто не видит тикет
    $this->validatorSchema->setPostValidator(
      new ValidatorCurrentUser('current_user_id','visible_to_users_list',array(
        'invalid'=>'Нельзя сделать ответственным того, кто не видит тикет',
      )
    ));
    
    
    
    
    $this->user=sfContext::getInstance()->getUser()->getGuardUser();
    
    
    unset($this['is_closed'],$this['project_id']);
    
    unset($this->validatorSchema['created_at']);
    unset($this->validatorSchema['updated_at']);
  }
  
  function doUpdateObject($values)
  {
    //Записываем проект, к которому привязан тикет
    $values['project_id']=sfContext::getInstance()->getUser()->getGuardUser()->Profile->CurrentProject->id;
    
    
    parent::doUpdateObject($values);
  }  
  
  function doSave($conn=null)
  {
    parent::doSave($conn);
    
    //Записываем, что тикет может быть виден самому себе
    $this->getObject()->link('VisibleToUsers',sfContext::getInstance()->getUser()->getGuardUser()->Profile->id,true);
    
    //Создаем первое сообщение у тикета
    $message=new Message();
    $message->ticket_id=$this->getObject()->id;
    foreach ($this->getObject()->VisibleToUsers as $user)
    {
      $message->VisibleToUsers[]=$user;
      
      //Записываем, что сообщение видно себе
      $message->VisibleToUsers[]=sfContext::getInstance()->getUser()->getGuardUser()->Profile;
    }
    $message->user_id=sfContext::getInstance()->getUser()->getGuardUser()->id;
    $message->text=$this->getValue('message_text');
    $message->save();
    
  }
}
